//
// Created by mazaiting on 2024/4/27.
//

#include <bits/stdc++.h>

using namespace std;

template<typename T>
struct LinkNode            //单链表结点类型
{
    T data;                        //存放数据元素
    LinkNode<T> *next;                //下一个结点的指针
    LinkNode() : next(NULL) {}            //构造函数
    explicit LinkNode(T d) : data(d), next(NULL) {}        //重载构造函数
};

template<typename T>
class CLinkList               //循环单链表类
{
public:
    LinkNode<T> *head;          //循环单链表头结点
    CLinkList()              //构造函数,创建空循环单链表
    {
        head = new LinkNode<T>();
        head->next = head;          //构成循环的空链表
    }

    ~CLinkList()              //析构函数,销毁循环单链表
    {
        LinkNode<T> *pre, *p;
        pre = head;
        p = pre->next;
        while (p != head)          //用p遍历并释放其前驱结点
        {
            delete pre;          //释放pre结点
            pre = p;
            p = p->next;      //pre,p同步后移一个结点
        }
        delete pre;          //释放尾结点
    }
    //线性表的基本运算算法
};

template<typename T>
int Count(CLinkList<T> &L, T x)     //求解算法
{
    int cnt = 0;             //cnt置为0
    LinkNode<T> *p = L.head->next;     //首先让p指向首结点
    while (p != L.head)         //遍历循环单链表
    {
        if (p->data == x)
            cnt++;             //找到一个值为x的结点cnt增1
        p = p->next;                  //p后移一个结点
    }
    return cnt;
}




